#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int MAXN=400000;
int ed,_x[]={0,1,-1,0,0},_y[]={0,0,0,1,-1},mi[10];
bool vis[MAXN];
struct node
{
	int a[4][4],x,y,dep;
};
queue<node>q;
int kangtuo(node x)
{
	int tmp1[10]={0},ret=0,tmp2=0;
	bool vis[10]={0};
	for(int i=1;i<=3;++i)
		for(int j=1;j<=3;++j)
			tmp1[++tmp2]=x.a[i][j]+1;
	for(int i=1;i<=8;++i)
	{
		int cnt=0;
		for(int j=1;j<tmp1[i];++j)cnt+=(!vis[j]);
		ret+=cnt*mi[9-i];
		vis[tmp1[i]]=true;
	}
	return ret+1;
}
void bfs()
{
	while(!q.empty())
	{
		node u=q.front();q.pop();
		for(int i=1;i<=4;++i)
		{
			node v=u;v.x+=_x[i];v.y+=_y[i];++v.dep;
			if(!v.x||!v.y||v.x>3||v.y>3)continue;
			v.a[u.x][u.y]=v.a[v.x][v.y];
			v.a[v.x][v.y]=0;
			int tmp=kangtuo(v);
			if(vis[tmp])continue;
			if(tmp==ed)
			{
				printf("%d\n",v.dep);
				return;
			}
			vis[tmp]=true;
			q.push(v);
		}
	}
	return;
}
int main()
{
	mi[0]=1;
	for(int i=1;i<=9;++i)mi[i]=mi[i-1]*i;
	node tmp;
	for(int i=1;i<=3;++i)
		for(int j=1;j<=3;++j)
		{
			int x;
			scanf("%d",&x);
			if(!x)tmp.x=i,tmp.y=j;
			tmp.a[i][j]=x;
		}
	tmp.dep=0;
	q.push(tmp);
	vis[kangtuo(tmp)]=true;
	for(int i=1;i<=3;++i)
		for(int j=1;j<=3;++j)
			scanf("%d",&tmp.a[i][j]);
	ed=kangtuo(tmp);
	bfs();
	return 0;
}
